package com.chenqi.library.recycleview.base

import android.support.v7.widget.GridLayoutManager
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.StaggeredGridLayoutManager
import android.support.v7.widget.helper.ItemTouchHelper


/**
 * 作者: CQ
 * 日期: 2021-03-15
 * 说明:支持item滑动和拖拽
 */
class ItemTouchCallBack : ItemTouchHelper.Callback() {

    private lateinit var onItemTouchListener: OnItemTouchListener

    fun setOnItemTouchListener(onItemTouchListener: OnItemTouchListener?) {
        this.onItemTouchListener = onItemTouchListener!!
    }

    var isDrag = false // 是否支持拖动切换数据
    var isSwipe = false // 是否支持滑动删除

    /**
     * 根据 RecyclerView 不同的布局管理器，设置不同的滑动、拖动方向
     * 该方法使用 makeMovementFlags(int dragFlags, int swipeFlags) 方法返回
     * 参数: dragFlags:拖动的方向
     *      swipeFlags:滑动的方向 (可做删除)
     * @param recyclerView
     * @param viewHolder
     * @return
     */
    override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {

        return if (recyclerView.layoutManager is GridLayoutManager || recyclerView.layoutManager is StaggeredGridLayoutManager) {
            //此处不需要进行滑动操作，可设置为除4和8之外的整数，这里设为0
            //不支持滑动
            onMakeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT, 0)
        } else {
            // 如果是纵向Linear布局，则能上下拖动，左右滑动
            var dragFlags = 0
            var swipeFlags = 0
            // 如果是纵向Linear布局，则能上下拖动，左右滑动
            if ((recyclerView.layoutManager as LinearLayoutManager).orientation == LinearLayoutManager.VERTICAL) {
                dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
                swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
            } else {
                // 如果是横向Linear布局，则能左右拖动，上下滑动
                swipeFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
                dragFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
            }
            //如果是LinearLayoutManager则只能向上向下滑动，
            //此处第二个参数设置支持向右滑动
            onMakeMovementFlags(dragFlags, swipeFlags)
        }
    }

    private fun onMakeMovementFlags(dragFlags: Int, swipeFlags: Int): Int {
        val dragFlag = if (isDrag) {
            dragFlags
        } else {
            0
        }
        val swipeFlag = if (isSwipe) {
            swipeFlags
        } else {
            0
        }
        return makeMovementFlags(dragFlag, swipeFlag)
    }

    /**
     * 当 ItemTouchHelper 拖动一个Item时该方法将会被回调，Item将从旧的位置移动到新的位置
     * 如果不拖动这个方法将从来不会调用,返回true表示已经被移动到新的位置
     * @param recyclerView
     * @param viewHolder
     * @param target
     * @return
     */
    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        val fromPosition = viewHolder.adapterPosition
        val toPosition = target.adapterPosition
        onItemTouchListener.onMove(fromPosition, toPosition)
        return true
    }


    /**
     * 当Item被滑动的时候被调用
     * 如果你不滑动这个方法将不会被调用
     * @param viewHolder
     * @param direction
     */
    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
        //此处是侧滑删除的主要代码

        //此处是侧滑删除的主要代码
        val position = viewHolder.adapterPosition
        onItemTouchListener.onSwiped(position)
    }

    /**
     * 移动交换数据的更新监听
     */
    interface OnItemTouchListener {
        //拖动Item时调用
        fun onMove(fromPosition: Int, toPosition: Int)

        //滑动Item时调用
        fun onSwiped(position: Int)

    }
}